package com.lihang.rabbit1.service.impl;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.lihang.rabbit1.common.exception.BusinessException;
import com.lihang.rabbit1.common.page.PageReq;
import com.lihang.rabbit1.common.page.PageRes;
import com.lihang.rabbit1.common.util.BeanConvertUtil;
import com.lihang.rabbit1.dto.req.SysUserAddReq;
import com.lihang.rabbit1.dto.req.SysUserPageReq;
import com.lihang.rabbit1.dto.req.SysUserUpdateReq;
import com.lihang.rabbit1.dto.res.SysUserPageRes;
import com.lihang.rabbit1.entity.SysUser;
import com.lihang.rabbit1.mapper.SysUserMapper;
import com.lihang.rabbit1.service.ISysUserService;
import org.springframework.stereotype.Service;

/**
 * 系统用户Service实现类
 */
@Service
public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> implements ISysUserService {

    /**
     * 分页查询用户
     * 
     * @param req 分页查询参数
     * @return 分页结果
     */
    @Override
    public PageRes<SysUserPageRes> page(SysUserPageReq req) {

       Page<SysUserPageRes> page = baseMapper.pageList(req.toPage(), req);

       return PageRes.fromMybatisPage(page);

    }

    /**
     * 示例：使用通用分页请求参数进行用户查询
     * 
     * @param baseReq 基础分页请求参数
     * @return 用户分页结果
     */
    public PageRes<SysUserPageRes> pageWithGenericReq(PageReq baseReq) {
        // 1. 使用BeanConvertUtil转换分页请求参数
        SysUserPageReq userReq = BeanConvertUtil.convertPageReq(baseReq, SysUserPageReq.class);

        // 2. 可以在转换后设置用户查询特有的参数
        // userReq.setUsername("example");

        // 3. 使用转换后的参数执行查询
        Page<SysUserPageRes> page = baseMapper.pageList(userReq.toPage(), userReq);

        // 4. 使用BeanConvertUtil统一处理分页结果
        return BeanConvertUtil.convertPage(page, SysUserPageRes.class);
    }

    /**
     * 获取用户详情
     * 
     * @param id 用户ID
     * @return 用户详情
     */
    @Override
    public SysUserPageRes getUserById(Long id) {
        // 1. 获取用户信息
        SysUser user = getById(id);
        if (user == null) {
            throw new BusinessException("用户不存在");
        }

        // 2. 转换并返回结果
        return BeanConvertUtil.convert(user, SysUserPageRes.class);
    }

    /**
     * 新增用户
     * 
     * @param req 新增用户请求
     * @return 用户信息
     */
    @Override
    public SysUserPageRes saveUser(SysUserAddReq req) {
        // 1. 转换为实体
        SysUser user = BeanConvertUtil.convert(req, SysUser.class);

        // 2. 保存用户信息
        boolean success = save(user);
        if (!success) {
            throw new BusinessException("新增用户失败");
        }

        // 3. 转换并返回结果
        return BeanConvertUtil.convert(user, SysUserPageRes.class);
    }

    /**
     * 更新用户
     * 
     * @param req 更新用户请求
     * @return 用户信息
     */
    @Override
    public SysUserPageRes updateUser(SysUserUpdateReq req) {
        // 1. 转换为实体
        SysUser user = BeanConvertUtil.convert(req, SysUser.class);

        // 2. 更新用户信息
        boolean success = updateById(user);
        if (!success) {
            throw new BusinessException("更新用户失败");
        }

        // 3. 获取最新数据
        user = getById(user.getId());

        // 4. 转换并返回结果
        return BeanConvertUtil.convert(user, SysUserPageRes.class);
    }

    /**
     * 删除用户
     * 
     * @param id 用户ID
     * @return 是否成功
     */
    @Override
    public boolean deleteUser(Long id) {
        // 1. 删除用户
        boolean success = removeById(id);
        if (!success) {
            throw new BusinessException("删除用户失败");
        }
        // 2. 返回结果
        return true;
    }
}